Reapply 135035 with proper conditional inclusion, hopefully solving issues with it. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@135246 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/locale b/include/locale index f1ef8c3..549ae60 100644 --- a/include/locale +++ b/include/locale
@@ -197,11 +197,14 @@ locale_t __cloc(); #endif +typedef _VSTD::remove_pointer<locale_t>::type __locale_struct; +typedef _VSTD::unique_ptr<__locale_struct, decltype(&freelocale)> __locale_unique_ptr; +typedef _VSTD::unique_ptr<__locale_struct, decltype(&uselocale)> __locale_raii; + // OSX has nice foo_l() functions that let you turn off use of the global // locale. Linux, not so much. The following functions avoid the locale when // that's possible and otherwise do the wrong thing. FIXME. -#if __APPLE__ - +#ifdef _LIBCPP_STABLE_APPLE_ABI template <class _Tp> inline _LIBCPP_INLINE_VISIBILITY int @@ -269,77 +272,195 @@ return isdigit_l(__c, 0); } -#else // __APPLE__ -inline -#ifndef _LIBCPP_HAS_NO_ALWAYS_INLINE_VARIADICS -_LIBCPP_INLINE_VISIBILITY -#endif -int -__nolocale_sprintf(char* __restrict __str, - const char* __restrict __format, ...) -{ - va_list __ap; - va_start(__ap, __format); - int __result = vsprintf(__str, __format, __ap); - va_end(__ap); - return __result; -} -inline -#ifndef _LIBCPP_HAS_NO_ALWAYS_INLINE_VARIADICS -_LIBCPP_INLINE_VISIBILITY -#endif -int -__nolocale_snprintf(char* __restrict __str, size_t __size, - const char* __restrict __format, ...) -{ - va_list __ap; - va_start(__ap, __format); - int __result = vsnprintf(__str, __size, __format, __ap); - va_end(__ap); - return __result; -} -inline -#ifndef _LIBCPP_HAS_NO_ALWAYS_INLINE_VARIADICS -_LIBCPP_INLINE_VISIBILITY -#endif -int -__nolocale_asprintf(char** __ret, - const char* __restrict __format, ...) -{ - va_list __ap; - va_start(__ap, __format); - int __result = vasprintf(__ret, __format, __ap); - va_end(__ap); - return __result; -} -inline -#ifndef _LIBCPP_HAS_NO_ALWAYS_INLINE_VARIADICS -_LIBCPP_INLINE_VISIBILITY -#endif -int -__nolocale_sscanf(const char* __restrict __str, - const char* __restrict __format, ...) -{ - va_list __ap; - va_start(__ap, __format); - int __result = vsscanf(__str, __format, __ap); - va_end(__ap); - return __result; -} +#else // _LIBCPP_STABLE_APPLE_ABI + +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS +decltype(MB_CUR_MAX_L(_VSTD::declval<locale_t>())) inline _LIBCPP_INLINE_VISIBILITY -int -__nolocale_isxdigit(int __c) +__mb_cur_max_l(locale_t __l) { - return isxdigit(__c); + return MB_CUR_MAX_L(__l); +} +#else // _LIBCPP_LOCALE__L_EXTENSIONS +_LIBCPP_ALWAYS_INLINE inline +decltype(MB_CUR_MAX) __mb_cur_max_l(locale_t __l) +{ + __locale_raii __current(uselocale(__l), uselocale); + return MB_CUR_MAX; +} +#endif // _LIBCPP_LOCALE__L_EXTENSIONS + +_LIBCPP_ALWAYS_INLINE inline +wint_t __btowc_l(int __c, locale_t __l) +{ +#ifdef _LIBCPP_STABLE_APPLE_ABI + return btowc_l(__c, __l); +#else + __locale_raii __current(uselocale(__l), uselocale); + return btowc(__c); +#endif } -inline _LIBCPP_INLINE_VISIBILITY -int -__nolocale_isdigit(int __c) +_LIBCPP_ALWAYS_INLINE inline +int __wctob_l(wint_t __c, locale_t __l) { - return isdigit(__c); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + return wctob_l(__c, __l); +#else + __locale_raii __current(uselocale(__l), uselocale); + return wctob(__c); +#endif } -#endif // __APPLE__ + +_LIBCPP_ALWAYS_INLINE inline +size_t __wcsnrtombs_l(char *__dest, const wchar_t **__src, size_t __nwc, + size_t __len, mbstate_t *__ps, locale_t __l) +{ +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + return wcsnrtombs_l(__dest, __src, __nwc, __len, __ps, __l); +#else + __locale_raii __current(uselocale(__l), uselocale); + return wcsnrtombs(__dest, __src, __nwc, __len, __ps); +#endif +} + +_LIBCPP_ALWAYS_INLINE inline +size_t __wcrtomb_l(char *__s, wchar_t __wc, mbstate_t *__ps, locale_t __l) +{ +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + return wcrtomb_l(__s, __wc, __ps, __l); +#else + __locale_raii __current(uselocale(__l), uselocale); + return wcrtomb(__s, __wc, __ps); +#endif +} + +_LIBCPP_ALWAYS_INLINE inline +size_t __mbsnrtowcs_l(wchar_t * __dest, const char **__src, size_t __nms, + size_t __len, mbstate_t *__ps, locale_t __l) +{ +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + return mbsnrtowcs_l(__dest, __src, __nms__len, __ps, __l); +#else + __locale_raii __current(uselocale(__l), uselocale); + return mbsnrtowcs(__dest, __src, __nms, __len, __ps); +#endif +} + +_LIBCPP_ALWAYS_INLINE inline +size_t __mbrtowc_l(wchar_t *__pwc, const char *__s, size_t __n, + mbstate_t *__ps, locale_t __l) +{ +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + return mbrtowc_l(__pwc, __s, __n, __ps, __l); +#else + __locale_raii __current(uselocale(__l), uselocale); + return mbrtowc(__pwc, __s, __n, __ps); +#endif +} + +_LIBCPP_ALWAYS_INLINE inline +int __mbtowc_l(wchar_t *__pwc, const char *__pmb, size_t __max, locale_t __l) +{ +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + return mbtowc(__pwc, __pmb, __max, __l); +#else + __locale_raii __current(uselocale(__l), uselocale); + return mbtowc(__pwc, __pmb, __max); +#endif +} + +_LIBCPP_ALWAYS_INLINE inline +size_t __mbrlen_l(const char *__s, size_t __n, mbstate_t *__ps, locale_t __l) +{ +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + return mbrlen_l(__s, __n, __ps, __l); +#else + __locale_raii __current(uselocale(__l), uselocale); + return mbrlen(__s, __n, __ps); +#endif +} + +_LIBCPP_ALWAYS_INLINE inline +lconv *__localeconv_l(locale_t __l) +{ +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + return localeconv_l(__l); +#else + __locale_raii __current(uselocale(__l), uselocale); + return localeconv(); +#endif +} + +_LIBCPP_ALWAYS_INLINE inline +size_t __mbsrtowcs_l(wchar_t *__dest, const char **__src, size_t __len, + mbstate_t *__ps, locale_t __l) +{ +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + return mbsrtowcs_l(__dest, __src, __len, __ps, __l); +#else + __locale_raii __current(uselocale(__l), uselocale); + return mbsrtowcs(__dest, __src, __len, __ps); +#endif +} + +_LIBCPP_ALWAYS_INLINE inline +int __sprintf_l(char *__s, locale_t __l, const char *__format, ...) { + va_list __va; + va_start(__va, __format); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + int __res = vsprintf_l(__s, __l, __format, __va); +#else + __locale_raii __current(uselocale(__l), uselocale); + int __res = vsprintf(__s, __format, __va); +#endif + va_end(__va); + return __res; +} + +_LIBCPP_ALWAYS_INLINE inline +int __snprintf_l(char *__s, size_t __n, locale_t __l, const char *__format, ...) { + va_list __va; + va_start(__va, __format); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + int __res = vsnprintf_l(__s, __n, __l, __format, __va); +#else + __locale_raii __current(uselocale(__l), uselocale); + int __res = vsnprintf(__s, __n, __format, __va); +#endif + va_end(__va); + return __res; +} + +_LIBCPP_ALWAYS_INLINE inline +int __asprintf_l(char **__s, locale_t __l, const char *__format, ...) { + va_list __va; + va_start(__va, __format); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + int __res = vasprintf_l(__s, __l, __format, __va); +#else + __locale_raii __current(uselocale(__l), uselocale); + int __res = vasprintf(__s, __format, __va); +#endif + va_end(__va); + return __res; +} + +_LIBCPP_ALWAYS_INLINE inline +int __sscanf_l(const char *__s, locale_t __l, const char *__format, ...) { + va_list __va; + va_start(__va, __format); +#ifdef _LIBCPP_LOCALE__L_EXTENSIONS + int __res = vsscanf_l(__s, __l, __format, __va); +#else + __locale_raii __current(uselocale(__l), uselocale); + int __res = vsscanf(__s, __format, __va); +#endif + va_end(__va); + return __res; +} + +#endif // _LIBCPP_STABLE_APPLE_ABI // __scan_keyword // Scans [__b, __e) until a match is found in the basic_strings range @@ -753,7 +874,11 @@ int __save_errno = errno; errno = 0; char *__p2; +#ifdef _LIBCXX_STABLE_APPLE_ABI long long __ll = strtoll_l(__a, &__p2, __base, 0); +#else + long long __ll = strtoll_l(__a, &__p2, __base, __cloc()); +#endif int __current_errno = errno; if (__current_errno == 0) errno = __save_errno; @@ -793,7 +918,11 @@ int __save_errno = errno; errno = 0; char *__p2; +#ifdef _LIBCXX_STABLE_APPLE_ABI unsigned long long __ll = strtoull_l(__a, &__p2, __base, 0); +#else + unsigned long long __ll = strtoull_l(__a, &__p2, __base, __cloc()); +#endif int __current_errno = errno; if (__current_errno == 0) errno = __save_errno; @@ -821,7 +950,11 @@ if (__a != __a_end) { char *__p2; +#ifdef _LIBCXX_STABLE_APPLE_ABI long double __ld = strtold_l(__a, &__p2, 0); +#else + long double __ld = strtold_l(__a, &__p2, __cloc()); +#endif if (__p2 != __a_end) { __err = ios_base::failbit; @@ -1226,7 +1359,11 @@ break; // Stage 3 __a[sizeof(__a)-1] = 0; +#ifdef _LIBCPP_STABLE_APPLE_ABI if (__nolocale_sscanf(__a, "%p", &__v) != 1) +#else + if (__sscanf_l(__a, __cloc(), "%p", &__v) != 1) +#endif __err = ios_base::failbit; // EOF checked if (__b == __e) @@ -1331,13 +1468,21 @@ *__oe++ = __ct.widen(*__nf++); *__oe++ = __ct.widen(*__nf++); for (__ns = __nf; __ns < __ne; ++__ns) +#ifdef _LIBCPP_STABLE_APPLE_ABI if (!__nolocale_isxdigit(*__ns)) +#else + if (!isxdigit_l(*__ns, __cloc())) +#endif break; } else { for (__ns = __nf; __ns < __ne; ++__ns) +#ifdef _LIBCPP_STABLE_APPLE_ABI if (!__nolocale_isdigit(*__ns)) +#else + if (!isdigit_l(*__ns, __cloc())) +#endif break; } if (__grouping.empty()) @@ -1535,7 +1680,11 @@ + ((numeric_limits<long>::digits % 3) != 0) + 1; char __nar[__nbuf]; +#ifdef _LIBCPP_STABLE_APPLE_ABI int __nc = __nolocale_sprintf(__nar, __fmt, __v); +#else + int __nc = __sprintf_l(__nar, __cloc(), __fmt, __v); +#endif char* __ne = __nar + __nc; char* __np = this->__identify_padding(__nar, __ne, __iob); // Stage 2 - Widen __nar while adding thousands separators @@ -1561,7 +1710,11 @@ + ((numeric_limits<long long>::digits % 3) != 0) + 1; char __nar[__nbuf]; +#ifdef _LIBCPP_STABLE_APPLE_ABI int __nc = __nolocale_sprintf(__nar, __fmt, __v); +#else + int __nc = __sprintf_l(__nar, __cloc(), __fmt, __v); +#endif char* __ne = __nar + __nc; char* __np = this->__identify_padding(__nar, __ne, __iob); // Stage 2 - Widen __nar while adding thousands separators @@ -1587,7 +1740,11 @@ + ((numeric_limits<unsigned long>::digits % 3) != 0) + 1; char __nar[__nbuf]; +#ifdef _LIBCPP_STABLE_APPLE_ABI int __nc = __nolocale_sprintf(__nar, __fmt, __v); +#else + int __nc = __sprintf_l(__nar, __cloc(), __fmt, __v); +#endif char* __ne = __nar + __nc; char* __np = this->__identify_padding(__nar, __ne, __iob); // Stage 2 - Widen __nar while adding thousands separators @@ -1613,7 +1770,11 @@ + ((numeric_limits<unsigned long long>::digits % 3) != 0) + 1; char __nar[__nbuf]; +#ifdef _LIBCPP_STABLE_APPLE_ABI int __nc = __nolocale_sprintf(__nar, __fmt, __v); +#else + int __nc = __sprintf_l(__nar, __cloc(), __fmt, __v); +#endif char* __ne = __nar + __nc; char* __np = this->__identify_padding(__nar, __ne, __iob); // Stage 2 - Widen __nar while adding thousands separators @@ -1640,18 +1801,36 @@ char* __nb = __nar; int __nc; if (__specify_precision) +#ifdef _LIBCPP_STABLE_APPLE_ABI __nc = __nolocale_snprintf(__nb, __nbuf, __fmt, (int)__iob.precision(), __v); +#else + __nc = __snprintf_l(__nb, __nbuf, __cloc(), __fmt, + (int)__iob.precision(), __v); +#endif else +#ifdef _LIBCPP_STABLE_APPLE_ABI __nc = __nolocale_snprintf(__nb, __nbuf, __fmt, __v); +#else + __nc = __snprintf_l(__nb, __nbuf, __cloc(), __fmt, __v); +#endif unique_ptr<char, void(*)(void*)> __nbh(0, free); if (__nc > static_cast<int>(__nbuf-1)) { if (__specify_precision) +#ifdef _LIBCPP_STABLE_APPLE_ABI __nc = __nolocale_asprintf(&__nb, __fmt, (int)__iob.precision(), __v); +#else + __nc = __asprintf_l(&__nb, __cloc(), __fmt, + (int)__iob.precision()); +#endif else +#ifdef _LIBCPP_STABLE_APPLE_ABI __nc = __nolocale_asprintf(&__nb, __fmt, __v); +#else + __nc = __asprintf_l(&__nb, __cloc(), __fmt, (int)__iob.precision()); +#endif if (__nb == 0) __throw_bad_alloc(); __nbh.reset(__nb); @@ -1692,18 +1871,36 @@ char* __nb = __nar; int __nc; if (__specify_precision) +#ifdef _LIBCPP_STABLE_APPLE_ABI __nc = __nolocale_snprintf(__nb, __nbuf, __fmt, (int)__iob.precision(), __v); +#else + __nc = __snprintf_l(__nb, __nbuf, __cloc(), __fmt, + (int)__iob.precision(), __v); +#endif else +#ifdef _LIBCPP_STABLE_APPLE_ABI __nc = __nolocale_snprintf(__nb, __nbuf, __fmt, __v); +#else + __nc = __snprintf_l(__nb, __nbuf, __cloc(), __fmt, __v); +#endif unique_ptr<char, void(*)(void*)> __nbh(0, free); if (__nc > static_cast<int>(__nbuf-1)) { if (__specify_precision) +#ifdef _LIBCPP_STABLE_APPLE_ABI __nc = __nolocale_asprintf(&__nb, __fmt, (int)__iob.precision(), __v); +#else + __nc = __asprintf_l(&__nb, __cloc(), __fmt, + (int)__iob.precision()); +#endif else +#ifdef _LIBCPP_STABLE_APPLE_ABI __nc = __nolocale_asprintf(&__nb, __fmt, __v); +#else + __nc = __asprintf_l(&__nb, __cloc(), __fmt, (int)__iob.precision()); +#endif if (__nb == 0) __throw_bad_alloc(); __nbh.reset(__nb); @@ -1739,7 +1936,11 @@ char __fmt[6] = "%p"; const unsigned __nbuf = 20; char __nar[__nbuf]; +#ifdef _LIBCPP_STABLE_APPLE_ABI int __nc = __nolocale_sprintf(__nar, __fmt, __v); +#else + int __nc = __sprintf_l(__nar, __cloc(), __fmt, __v); +#endif char* __ne = __nar + __nc; char* __np = this->__identify_padding(__nar, __ne, __iob); // Stage 2 - Widen __nar @@ -3423,7 +3624,11 @@ // secure memory for digit storage if (__n > __bs-1) { +#ifdef _LIBCPP_STABLE_APPLE_ABI __n = __nolocale_asprintf(&__bb, "%.0Lf", __units); +#else + __n = __asprintf_l(&__bb, __cloc(), "%.0Lf", __units); +#endif if (__bb == 0) __throw_bad_alloc(); __hn.reset(__bb);